package com.jackstraw.jack_base.util.entity.mapstruct;

import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.Collection;

/**
 * Mapstruct类拷贝基础方法接口
 * <p>
 * 针对数据库实体类，需要增加四类实体类
 * PO：直接和数据库交互的实体
 * BO：业务处理时数据实体
 * VO：传给前端的实体（时间类型格式化为字符串）
 * DTO：服务间交互的实体
 * <p>
 * BO可以与PO、VO、DTO进行转换
 * PO仅仅可以与BO进行转换
 * VO仅仅可以与BO进行转换
 * DTO仅仅可以与BO进行转换
 *
 * @param <Bo>
 * @param <To>
 */
public interface BasicMapstructMapper<Bo, To> {

    /**
     * 仅供在非spring场景下使用
     */
    BasicMapstructMapper MAPPER = Mappers.getMapper(BasicMapstructMapper.class);

    /**
     * 创建一个To对象，并将入参Bo对象内相同字段赋值给To
     *
     * @param bo
     * @return
     */
    @Mappings(value = {})
    To to(Bo bo);

    /**
     * 创建一个Bo对象，并将入参To对象内相同字段赋值给Bo
     *
     * @param to
     * @return
     */
    @Mappings(value = {})
    Bo bo(To to);

    /**
     * 创建一个To对象，并将入参To对象内相同字段赋值给To
     *
     * @param to
     * @return
     */
    @Mappings(value = {})
    To toCopy(To to);

    /**
     * 创建一个Bo对象，并将入参Bo对象内相同字段赋值给Bo
     *
     * @param bo
     * @return
     */
    @Mappings(value = {})
    Bo boCopy(Bo bo);

    /**
     * 类似{@link BasicMapstructMapper#to(Object)} 方法，不过是处理集合
     *
     * @param bos
     * @return
     */
    @Mappings(value = {})
    Collection<To> toBoS(Collection<Bo> bos);

    /**
     * 类似{@link BasicMapstructMapper#bo(Object)} 方法，不过是处理集合
     *
     * @param tos
     * @return
     */
    @Mappings(value = {})
    Collection<Bo> boToS(Collection<To> tos);

    /**
     * 类似{@link BasicMapstructMapper#toCopy(Object)} 方法，不过是处理集合
     *
     * @param bos
     * @return
     */
    @Mappings(value = {})
    Collection<To> toToS(Collection<To> bos);

    /**
     * 类似{@link BasicMapstructMapper#boCopy(Object)} 方法，不过是处理集合
     *
     * @param tos
     * @return
     */
    @Mappings(value = {})
    Collection<Bo> boBoS(Collection<Bo> tos);

    /**
     * 将bo中与to相同字段赋值给to，并返回to
     *
     * @param bo
     * @param to
     * @return
     */
    @Mappings(value = {})
    To toUpdateWithBo(Bo bo, @MappingTarget To to);

    /**
     * 将to中与bo相同字段赋值给bo，并返回bo
     *
     * @param to
     * @param bo
     * @return
     */
    @Mappings(value = {})
    Bo boUpdateWithTo(To to, @MappingTarget Bo bo);

    /**
     * 将toSource中与toTarget相同字段赋值给toTarget，并返回toTarget
     *
     * @param toSource
     * @param toTarget
     * @return
     */
    @Mappings(value = {})
    To toUpdateWithTo(To toSource, @MappingTarget To toTarget);

    /**
     * 将boSource中与boTarget相同字段赋值给boTarget，并返回boTarget
     *
     * @param boSource
     * @param boTarget
     * @return
     */
    @Mappings(value = {})
    Bo boUpdateWithBo(Bo boSource, @MappingTarget Bo boTarget);

}
